#include "database.h"

DataBase::DataBase()
{
	
}

DataBase::~DataBase()
{
	
}

bool DataBase::database_connect()
{
	//初始化数据库句柄
	mysql = mysql_init(NULL);
	
	//向数据库发起连接
	mysql = mysql_real_connect(mysql, "localhost", "root", "root", "musicplayer", 0, NULL, 0);
	if(mysql == NULL)
	{
		std::cout << "[DATABASE CONNECT FAILURE] ";
		std::cout << mysql_error(mysql) << std::endl;
		return false;
	}
	
	/*if (mysql_query(mysqL,"set names utf8;") !=0) //如果有设置中文加判断
	{}*/
	
	return true;
}

void DataBase::database_disconnect()
{
	mysql_close(mysql);
}

bool DataBase::database_init_table()
{
	if(!this->database_connect())	//连接数据库
		return false;
	const char *sql = "create table if not exists account(appid char(11),password varchar(16),deviceid varchar(8))charset utf8;";
	
	if(mysql_query(mysql, sql) != 0)	//操作数据库
	{
		std::cout << "[MYSQL QUERY ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return false;
	}
	
	this->database_disconnect();
	
	return true;
}

bool DataBase::database_user_exist(std::string appid)
{
	char sql[256] = {0};
	sprintf(sql, "select * from account where appid = '%s';", appid.c_str());
	
	if(mysql_query(mysql, sql) != 0)	//执行SQL查询语句，根据appid查询内容,成功返回0
	{
		std::cout << "[MYSQL QUERY ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return true;
	}
	
	//查询到了内容，获取内容把内容保存在结构体
	MYSQL_RES *res = mysql_store_result(mysql);	// 声明一个指向MYSQL_RES结构的指针，用于存储从MySQL服务器获取的查询结果集。
	if(NULL == res)
	{
		std::cout << "[MYSQL STORE RESULT ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return true;
	}
	// 使用mysql_fetch_row函数尝试获取结果集中的一行数据。返回下一个字符串数组的地址
	MYSQL_ROW row = mysql_fetch_row(res);
	if(row == NULL)
	{
		return false;
	}
	else	//有数据说明用户存在
	{
		return true;
	}
}

void DataBase::database_add_user(std::string a, std::string p)
{
	char sql[128] = {0};
	sprintf(sql, "insert into account (appid, password) values ('%s', '%s');", a.c_str(), p.c_str());
	
	if(mysql_query(mysql, sql) != 0)
	{
		std::cout << "[MYSQL QUERY ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
	}
}

bool DataBase::database_password_correct(std::string a, std::string p)
{
	char sql[256] = {0};
	sprintf(sql, "select password from account where appid = '%s';", a.c_str());
	if(mysql_query(mysql, sql) != 0)
	{
		std::cout << "[MYSQL QUERY ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return false;
	}
	
	//查询到了内容，获取内容把内容保存在结构体
	MYSQL_RES *res = mysql_store_result(mysql);	// 声明一个指向MYSQL_RES结构的指针，用于存储从MySQL服务器获取的查询结果集。
	if(NULL == res)
	{
		std::cout << "[MYSQL STORE RESULT ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return false;
	}
	// 使用mysql_fetch_row函数尝试获取结果集中的一行数据。返回下一个字符串数组的地址
	MYSQL_ROW row = mysql_fetch_row(res);
	if(row == NULL)
	{
		std::cout << "[MYSQL SFETCH EOW ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return false;
	}
	
	if(!strcmp(p.c_str(), row[0]))	//判断密码是否正确
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool DataBase::database_user_bind(std::string a, std::string &d)
{
	char sql[256] = {0};
	sprintf(sql, "select deviceid from account where appid = '%s';", a.c_str());
	if(mysql_query(mysql, sql) != 0)
	{
		std::cout << "[MYSQL QUERY ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return false;
	}
	
	//查询到了内容，获取内容把内容保存在结构体
	MYSQL_RES *res = mysql_store_result(mysql);	// 声明一个指向MYSQL_RES结构的指针，用于存储从MySQL服务器获取的查询结果集。
	if(NULL == res)
	{
		std::cout << "[MYSQL STORE RESULT ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return false;
	}
	// 使用mysql_fetch_row函数尝试获取结果集中的一行数据。返回下一个字符串数组的地址
	MYSQL_ROW row = mysql_fetch_row(res);
	if(row == NULL)
	{
		std::cout << "[MYSQL SFETCH EOW ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
		return false;
	}
	
	if(row[0] == NULL)
	{
		return false;
	}
	else
	{
		d = std::string(row[0]);
		return true;
	}
}

void DataBase::database_bind_user(std::string a, std::string d)
{
	char sql[256] = {0};
	sprintf(sql, "update account set deviceid = '%s' where appid = '%s';", d.c_str(), a.c_str());
	if(mysql_query(mysql, sql) != 0)
	{
		std::cout << "[MYSQL QUERY ERROR] ";
		std::cout << mysql_error(mysql) << std::endl;
	}
}
